home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 11
/
Cream of the Crop 11-1.iso
/
games
/
ted5.zip
/
TED5-1.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-12-06
|
43KB
|
2,090 lines
////////////////////////////////////////////////////
////////////////////////////////////////////////////
//
// TED5-1
//
////////////////////////////////////////////////////
////////////////////////////////////////////////////
#include "ted5.h"
#pragma hdrstop
void InputMap(char *lvlname,unsigned *levelw,unsigned *levelh,int exitok);
void MNameOn(int x,int y,int i);
void MNameOff(int x,int y,int i);
void DnarOn(int x,int y);
void DnarOff(int x,int y);
void UparOn(int x,int y);
void UparOff(int x,int y);
void ExitOn(int x,int y);
void ExitOff(int x,int y);
void TInfoNon(int x,int y,int b);
void TInfoNoff(int x,int y,int b);
void TInfoMNon(int x,int y,int b);
void TInfoMNoff(int x,int y,int b);
void TIDoneOn(int x,int y);
void TIDoneOff(int x,int y);
////////////////////////////////////////////////////
//
// SAVE the current map
//
////////////////////////////////////////////////////
void SaveMap(int delmap)
{
memptr block;
long fsize,size,nsize,change;
MapHeaderStr TempHeader;
int i,XMStemp;
char string[100],TEDid[]=IDSTRING;
RemoveUndoBuffers();
if (delmap)
{
LoadFile(mapname,(char huge *)&TempHeader,
MapFileHeader->dataoffsets[whichmap],sizeof(MapHeaderStr));
strcpy(string,"Deleting Map, '");
strcat(string,TempHeader.name);
}
else
{
strcpy(string,"Saving Map, '");
strcat(string,MapHeader.name);
}
strcat(string,"'.");
ErrDialog(string,"");
BackupFile(mapheadname);
BackupFile(SM_loadname);
if (delmap || DirtyFlag)
{
//
// SAVE MAP FILE HEADER
//
if (delmap)
MapFileHeader->dataoffsets[whichmap]=-1;
SaveFile(mapheadname,MK_FP(MapFileHeader,0),0,sizeof(MapFileHeaderStr));
fsize=sizeof(MapFileHeaderStr);
//
// COMPRESS & SAVE TILEINFOS
//
MMAllocate(&block,tilenum);
for (i=0;i<numtplanes;i++)
{
MapFileHeader->tileinfooff[i]=fsize;
nsize=RLEBCompress(MK_FP(Tinfo[i],0),tilenum,MK_FP(block,0),MapFileHeader->RLEWtag);
MapFileHeader->tileinfolen[i]=nsize;
SaveFile(mapheadname,MK_FP(block,0),fsize,nsize);
fsize+=nsize;
}
MMFreePtr(&block);
MMAllocate(&block,tilemnum);
for (i=0;i<numtmplanes;i++)
{
MapFileHeader->tileinfomoff[i]=fsize;
nsize=RLEBCompress(MK_FP(TMinfo[i],0),tilemnum,MK_FP(block,0),MapFileHeader->RLEWtag);
MapFileHeader->tileinfomlen[i]=nsize;
SaveFile(mapheadname,MK_FP(block,0),fsize,nsize);
fsize+=nsize;
}
MMFreePtr(&block);
MapFileHeader->oldtilenum=tilenum;
MapFileHeader->oldtilemnum=tilemnum;
SaveFile(mapheadname,MK_FP(MapFileHeader,2),2,sizeof(MapFileHeaderStr)-2);
//
// SAVE ALREADY COMPRESSED MAPS
//
//
// IF MAPS ARE IN XMS ALREADY, ALLOCATE A NEW BUFFER
// TO SHUFFLE ALREADY-COMPRESSED MAPS INTO
//
if (XMSmaps)
{
int planes;
long len=filelen(SM_loadname);
planes=(MapFileHeader->maptype&BPLANE>0)+
(MapFileHeader->maptype&FPLANE>0)+
(MapFileHeader->maptype&IPLANE>0);
len+=2L*mapwidth*mapheight*planes;
if (1024L*XMSTotalFree()<len)
{
XMSFreeMem(XMSmaps);
XMSmaps=0;
}
else
XMStemp=XMSAllocate(len);
}
//
// NOTE: I AM STORING "TED5" AT THE START OF THE FILE BECAUSE
// SAVING THE FILE AT OFFSET 0 WILL TRASH IT (I HAVE TO RE-SAVE THE HEADER!)
//
if (XMSmaps)
XMSmove(0,(long)&TEDid,XMStemp,0,strlen(TEDid));
else
SaveFile(SM_name,(char huge *)TEDid,0,strlen(TEDid));
fsize=strlen(TEDid);
for (i=0;i<100;i++)
{
long oldoff;
if (MapFileHeader->dataoffsets[i]==-1 || i==whichmap)
continue;
oldoff=MapFileHeader->dataoffsets[i];
if (XMSmaps)
XMSmove(XMSmaps,oldoff,0,(long)&TempHeader,sizeof(MapHeaderStr));
else
LoadFile(SM_loadname,(char huge *)&TempHeader,oldoff,sizeof(MapHeaderStr));
strcpy(TempHeader.name,MapNames[i]);
MapFileHeader->dataoffsets[i]=fsize;
size=TempHeader.mapbkgndlen+TempHeader.mapfrgndlen+TempHeader.mapinfolen;
change=TempHeader.mapbkgndpl-fsize-sizeof(MapHeaderStr);
TempHeader.mapbkgndpl-=change;
TempHeader.mapfrgndpl-=change;
TempHeader.mapinfopl-=change;
if (XMSmaps)
XMSmove(0,(long)&TempHeader,XMStemp,fsize,sizeof(MapHeaderStr));
else
SaveFile(SM_name,(char huge *)&TempHeader,fsize,sizeof(MapHeaderStr));
fsize+=sizeof(MapHeaderStr);
if (XMSmaps)
{
XMSmove(XMSmaps,oldoff+sizeof(MapHeaderStr),XMStemp,fsize,size);
fsize+=size;
XMSmove(0,(long)"!ID!",XMStemp,fsize,4);
fsize+=4;
}
else
{
MMAllocate(&block,size);
LoadFile(SM_loadname,MK_FP(block,0),oldoff+sizeof(MapHeaderStr),size);
SaveFile(SM_name,MK_FP(block,0),fsize,size);
fsize+=size;
SaveFile(SM_name,"!ID!",fsize,4);
fsize+=4;
MMFreePtr(&block);
}
}
//
// SAVE CURRENT MAP AT END OF FILE
//
if (!delmap)
{
MapFileHeader->dataoffsets[whichmap]=fsize;
MapFileHeader->datalengths[whichmap]=sizeof(MapHeaderStr);
if (XMSmaps)
XMSmove(0,(long)&MapHeader,XMStemp,fsize,sizeof(MapHeaderStr));
else
SaveFile(SM_name,(char huge *)&MapHeader,fsize,sizeof(MapHeaderStr));
fsize+=sizeof(MapHeaderStr);
size=MapHeader.width*MapHeader.height*sizeof(int);
MMAllocate(&block,size);
if (MapFileHeader->maptype & BPLANE)
{
MapHeader.mapbkgndpl=fsize;
nsize=RLEWCompress(MK_FP(MapBkgnd,0),size,MK_FP(block,0),MapFileHeader->RLEWtag);
MapHeader.mapbkgndlen=nsize+2;
if (XMSmaps)
XMSmove(0,(long)&size,XMStemp,fsize,2);
else
SaveFile(SM_name,(char huge *)&size,fsize,2);
fsize+=2;
if (XMSmaps)
XMSmove(0,(long)MK_FP(block,0),XMStemp,fsize,nsize);
else
SaveFile(SM_name,MK_FP(block,0),fsize,nsize);
fsize+=nsize;
}
else
MapHeader.mapbkgndlen=0;
if (MapFileHeader->maptype & FPLANE)
{
MapHeader.mapfrgndpl=fsize;
nsize=RLEWCompress(MK_FP(MapFrgnd,0),size,MK_FP(block,0),MapFileHeader->RLEWtag);
MapHeader.mapfrgndlen=nsize+2;
if (XMSmaps)
XMSmove(0,(long)&size,XMStemp,fsize,2);
else
SaveFile(SM_name,(char huge *)&size,fsize,2);
fsize+=2;
if (XMSmaps)
XMSmove(0,(long)MK_FP(block,0),XMStemp,fsize,nsize);
else
SaveFile(SM_name,MK_FP(block,0),fsize,nsize);
fsize+=nsize;
}
else
MapHeader.mapfrgndlen=0;
if (MapFileHeader->maptype & IPLANE)
{
MapHeader.mapinfopl=fsize;
nsize=RLEWCompress(MK_FP(MapInfoPl,0),size,MK_FP(block,0),MapFileHeader->RLEWtag);
MapHeader.mapinfolen=nsize+2;
if (XMSmaps)
XMSmove(0,(long)&size,XMStemp,fsize,2);
else
SaveFile(SM_name,(char huge *)&size,fsize,2);
fsize+=2;
if (XMSmaps)
XMSmove(0,(long)MK_FP(block,0),XMStemp,fsize,nsize);
else
SaveFile(SM_name,MK_FP(block,0),fsize,nsize);
fsize+=nsize;
}
else
MapHeader.mapinfolen=0;
if (XMSmaps)
XMSmove(0,(long)"!ID!",XMStemp,fsize,4);
else
SaveFile(SM_name,"!ID!",fsize,4);
fsize+=4;
MMFreePtr(&block);
// RE-SAVE HEADER
if (XMSmaps)
XMSmove(0,(long)&MapHeader,XMStemp,
MapFileHeader->dataoffsets[whichmap],sizeof(MapHeaderStr));
else
SaveFile(SM_name,(char huge *)&MapHeader,
MapFileHeader->dataoffsets[whichmap],sizeof(MapHeaderStr));
//
// RE-SAVE FILE HEADER
// NOTE: The "2" is so SaveFile doesn't truncate the fucking file!
//
SaveFile(mapheadname,MK_FP(MapFileHeader,2),2,sizeof(MapFileHeaderStr)-2);
}
if (XMSmaps)
{
#define BCSIZE 0x4000
long size=fsize,clen,coff;
//
// SAVE ENTIRE MAPFILE IN XMS TO DISK!
//
XMSFreeMem(XMSmaps);
XMSmaps=XMStemp;
MMAllocate(&block,BCSIZE);
coff=0;
do
{
clen=BCSIZE;
if (size<BCSIZE)
clen=size;
XMSmove(XMSmaps,coff,0,(long)MK_FP(block,0),clen);
SaveFile(SM_loadname,MK_FP(block,0),coff,clen);
size-=BCSIZE;
coff+=clen;
} while(size>0);
MMFreePtr(&block);
}
else
{
unlink(SM_loadname);
rename(SM_name,SM_loadname);
}
}
AllocateUndoBuffers();
UndoRegion.x=-1;
SaveUndo(0,0,mapwidth,mapheight);
RestoreBackground();
}
////////////////////////////////////////////////////
//
// BACKUP FILES!
//
////////////////////////////////////////////////////
void BackupFile(char *filename)
{
#define BUFSIZE 0x8000
memptr block;
long size,clen,coff;
int i;
char backupname[14];
size = filelen(filename);
if (!size)
return;
strcpy(backupname,filename);
for (i=strlen(backupname);i;i--)
if (backupname[i] == '.')
backupname[i+1] = 0;
strcat(backupname,"BAK");
MMAllocate(&block,BUFSIZE);
coff=0;
do
{
clen=BUFSIZE;
if (size<BUFSIZE)
clen=size;
LoadFile(filename,(char far *)block,coff,clen);
SaveFile(backupname,MK_FP(block,0),coff,clen);
size-=BUFSIZE;
coff+=clen;
} while(size>0);
MMFreePtr(&block);
}
////////////////////////////////////////////////////
//
// SAVE OUT TEDINFO FILE
//
////////////////////////////////////////////////////
void SaveTEDInfo(void)
{
BackupFile(infoname);
TEDInfo->oscrx=xbase;
TEDInfo->oscry=ybase;
_fstrcpy(TEDInfo->launchname,(char far *)launchname);
SaveFile(infoname,MK_FP(TEDInfo,0),0,sizeof(InfoStruct));
}
////////////////////////////////////////////////////
//
// WRITE OUT THE OUTPUT HEADER FILE
//
////////////////////////////////////////////////////
char * _nfstrcpy(char *dest,char far *source)
{
int i;
for (i=0;i<_fstrlen(source);i++)
*(dest+i)=*(source+i);
return dest;
}
void SaveOutputHeader(void)
{
char outhead[14]="MAPHEAD.",dot_h[14]="MAPS",t[15],tm[15],temp[40],temp1[40];
FILE *fp;
OutputHeadStr OutHead;
int i,Thelast;
long fsize;
ErrDialog("Saving header...","");
strcat(outhead,ext);
BackupFile(outhead);
memset(&OutHead,0,sizeof(OutputHeadStr));
OutHead.RLEWtag=MapFileHeader->RLEWtag;
for (i=0;i<100;i++)
OutHead.dataoffsets[i]=MapFileHeader->dataoffsets[i];
fsize=sizeof(OutputHeadStr);
SaveFile(outhead,(char huge *)&OutHead,0,fsize);
for (i=0;i<numtplanes;i++)
{
SaveFile(outhead,MK_FP(Tinfo[i],0),fsize,tilenum);
fsize+=tilenum;
}
for (i=0;i<numtmplanes;i++)
{
SaveFile(outhead,MK_FP(TMinfo[i],0),fsize,tilemnum);
fsize+=tilemnum;
}
RestoreBackground();
//
// DUMP OUT A MAPSext.H HEADER FILE
//
if (writeH)
{
ErrDialog("Saving .h file...","");
strcat(dot_h,ext);
strcat(dot_h,".H");
unlink(dot_h);
if ((fp=fopen(dot_h,"wt"))==NULL)
return;
fprintf(fp,"///////////////////////////////////////\n");
fprintf(fp,"//\n");
fprintf(fp,"// TED5 Map Header for %s\n",ext);
fprintf(fp,"//\n");
fprintf(fp,"///////////////////////////////////////\n");
Thelast=99;
for (i=99;i>=0;i--)
if (MapFileHeader->dataoffsets[i]>=0)
{
Thelast=i;
break;
}
fprintf(fp,"\n");
fprintf(fp,"//\n");
fprintf(fp,"// Map Names\n");
fprintf(fp,"//\n");
fprintf(fp,"typedef enum {\n");
for (i=0;i<100;i++)
if (MapFileHeader->dataoffsets[i]>=0)
{
char temp[28];
int j;
strcpy(temp,&MapNames[i][0]);
strcat(temp,"_MAP");
for (j=0;j<strlen(temp);j++)
if (temp[j]==' ')
temp[j]='_';
strcat(temp,",");
while(strlen(temp)<25)
strcat(temp," ");
fprintf(fp,"\t\t%s// %d\n",strupr(temp),i);
}
else
if (i<Thelast)
fprintf(fp,"\t\tEMPTYMAP%d,\n",i);
fprintf(fp,"\t\tLASTMAP\n\t } mapnames;\n");
switch(tsize)
{
case 1:
strcpy(t,"NUMTILE8");
strcpy(tm,"NUMTILE8M");
break;
case 2:
strcpy(t,"NUMTILE16");
strcpy(tm,"NUMTILE16M");
break;
case 3:
strcpy(t,"NUMTILE32");
strcpy(tm,"NUMTILE32M");
}
if (numtplanes)
{
fprintf(fp,"\n");
fprintf(fp,"//\n");
fprintf(fp,"// TILEINFO offsets\n");
fprintf(fp,"//\n");
memset(temp,0,sizeof(temp));
memset(temp1,0,sizeof(temp1));
fprintf(fp,"#define %s\x9\x9%d\n",
strupr(_nfstrcpy(temp,MapFileHeader->tnames[0])),
sizeof(OutputHeadStr));
for (i=1;i<numtplanes;i++)
{
memset(temp,0,sizeof(temp));
memset(temp1,0,sizeof(temp1));
fprintf(fp,"#define %s\x9\x9(%s+%s)\n",
strupr(_nfstrcpy(temp,MapFileHeader->tnames[i])),
strupr(_nfstrcpy(temp1,MapFileHeader->tnames[i-1])),
t);
}
}
if (numtmplanes)
{
fprintf(fp,"\n");
fprintf(fp,"//\n");
fprintf(fp,"// TILEINFOM offsets\n");
fprintf(fp,"//\n");
memset(temp,0,sizeof(temp));
memset(temp1,0,sizeof(temp1));
fprintf(fp,"#define %s\x9\x9(%s+%s)\n",
strupr(_nfstrcpy(temp,MapFileHeader->tmnames[0])),
strupr(_nfstrcpy(temp1,MapFileHeader->tnames[numtplanes-1])),
t);
for (i=1;i<numtmplanes;i++)
{
memset(temp,0,sizeof(temp));
memset(temp1,0,sizeof(temp1));
fprintf(fp,"#define %s\x9\x9(%s+%s)\n",
strupr(_nfstrcpy(temp,MapFileHeader->tmnames[i])),
strupr(_nfstrcpy(temp1,MapFileHeader->tmnames[i-1])),
tm);
}
}
fclose(fp);
writeH=0;
RestoreBackground();
}
}
////////////////////////////////////////////////////
//
// Initialize the TILEINFO/M arrays
//
////////////////////////////////////////////////////
btype TIb[]={{" ",1,2,1},
{" ",1,6,1},
{" Done ",12,9,2}};
DialogDef TId={" How many TILEINFO planes?\n\n\n\n"
" How many TILEINFOM planes?",
27,11,3,&TIb[0],NULL};
void InitTileinfo(void)
{
unsigned temp,which,oktoexit=0,ox,oy,i,j;
long fsize;
numtplanes=numtmplanes=0;
DrawDialog(&TId,1);
GetButtonXY(&TId,0,&sx,&sy);
printint(numtplanes);
if (MapFileHeader->maptype&FPLANE)
{
GetButtonXY(&TId,1,&sx,&sy);
printint(numtmplanes);
}
do
{
which=CheckButtons(&TId);
switch(which)
{
case 1:
MouseHide();
GetButtonXY(&TId,0,&sx,&sy);
ox=sx;
oy=sy;
print(TIb[0].text);
sx=ox;
sy=oy;
if ((temp=inputint(9))!=ESCOUT && temp<11 && temp)
numtplanes=temp;
sx=ox;
sy=oy;
print(TIb[0].text);
sx=ox;
sy=oy;
printint(numtplanes);
MouseShow();
case 2:
MouseHide();
GetButtonXY(&TId,1,&sx,&sy);
ox=sx;
oy=sy;
print(TIb[1].text);
sx=ox;
sy=oy;
if (MapFileHeader->maptype&FPLANE)
{
if ((temp=inputint(9))!=ESCOUT && temp<11 && temp)
numtmplanes=temp;
sx=ox;
sy=oy;
print(TIb[1].text);
sx=ox;
sy=oy;
printint(numtmplanes);
}
MouseShow();
break;
case 3:
MouseHide();
oktoexit=1;
GetButtonXY(&TId,2,&sx,&sy);
print(TIb[2].text);
MouseShow();
}
} while(!oktoexit);
RestoreBackground();
//
// allocate arrays
//
fsize=sizeof(MapFileHeaderStr);
for (i=0;i<numtplanes;i++)
{
MMAllocate((memptr *)&Tinfo[i],tilenum);
MapFileHeader->tileinfooff[i]=fsize; // THIS DOESN'T REALLY MATTER
fsize+=tilenum; // ....YET!
for(j=0;j<tilenum;j++)
*(Tinfo[i]+j)=0;
}
for (i=0;i<numtmplanes;i++)
{
MMAllocate((memptr *)&TMinfo[i],tilemnum);
MapFileHeader->tileinfomoff[i]=fsize;
fsize+=tilemnum;
for(j=0;j<tilemnum;j++)
*(TMinfo[i]+j)=0;
}
MapFileHeader->numtplanes=numtplanes;
MapFileHeader->numtmplanes=numtmplanes;
MapFileHeader->oldtilenum=tilenum;
MapFileHeader->oldtilemnum=tilemnum;
writeH=1;
}
////////////////////////////////////////////////////
//
// Item - Edit the TILEINFO names
//
////////////////////////////////////////////////////
btype TINb={" Done ",8,15,1};
DialogDef TINd={" Enter plane names:\n"
" TILEINFO TILEINFOM",
22,17,1,&TINb,NULL};
void Item_EditTinfoNames(void)
{
unsigned ox,oy,i,oktoexit=0;
int which;
MouseHide();
DrawDialog(&TINd,1);
GetDialogXY(&TINd,&sx,&sy);
ox=sx;
oy=sy;
DrawBorder(sx,sy+2,10,11,1);
sx=ox;
sy=oy;
DrawBorder(sx+11,sy+2,10,11,1);
for (i=0;i<10;i++)
{
sx=ox+1;
sy=oy+i+3;
fprint(MapFileHeader->tnames[i]);
sx=ox+12;
sy=oy+i+3;
fprint(MapFileHeader->tmnames[i]);
}
MouseShow();
do
{
if ((which=CheckList(ox+1,oy+3,8,numtplanes,TInfoNon,TInfoNoff,0))>=0)
{
char temp[8];
MouseHide();
redo:
sx=ox+1;
sy=oy+which+3;
print(" ");
sx=ox+1;
sy=oy+which+3;
if (input(temp,7))
{
for(i=0;i<8;i++)
MapFileHeader->tnames[which][i]=temp[i];
which++;
writeH=DirtyFlag=1;
if (which<numtplanes)
goto redo;
}
else
TInfoNoff(ox+1,oy+3+which,which);
MouseShow();
}
if ((which=CheckList(ox+12,oy+3,8,numtmplanes,TInfoMNon,TInfoMNoff,0))>=0)
{
char temp[8];
MouseHide();
redo1:
sx=ox+12;
sy=oy+which+3;
print(" ");
sx=ox+12;
sy=oy+which+3;
if (input(temp,7))
{
for(i=0;i<8;i++)
MapFileHeader->tmnames[which][i]=temp[i];
which++;
writeH=DirtyFlag=1;
if (which<numtmplanes)
goto redo1;
}
else
TInfoMNoff(ox+12,oy+3+which,which);
MouseShow();
}
GetButtonXY(&TINd,0,&sx,&sy);
if (!CheckList(sx,sy,6,1,TIDoneOn,TIDoneOff,1))
oktoexit++;
if (keydown[1])
{
while(keydown[1]);
oktoexit++;
}
}while(!oktoexit);
RestoreBackground();
}
void TInfoNon(int x,int y,int b)
{
xormask=1;
sx=x;
sy=y;
if (!MapFileHeader->tnames[b][0])
print(" ");
else
fprint(MapFileHeader->tnames[b]);
xormask=0;
}
void TInfoNoff(int x,int y,int b)
{
sx=x;
sy=y;
if (!MapFileHeader->tnames[b][0])
print(" ");
else
fprint(MapFileHeader->tnames[b]);
}
void TInfoMNon(int x,int y,int b)
{
xormask=1;
sx=x;
sy=y;
if (!MapFileHeader->tmnames[b][0])
print(" ");
else
fprint(MapFileHeader->tmnames[b]);
xormask=0;
}
void TInfoMNoff(int x,int y,int b)
{
sx=x;
sy=y;
if (!MapFileHeader->tmnames[b][0])
print(" ");
else
fprint(MapFileHeader->tmnames[b]);
}
void TIDoneOn(int x,int y)
{
xormask=1;
sx=x;
sy=y;
print(" Done ");
xormask=0;
}
void TIDoneOff(int x,int y)
{
sx=x;
sy=y;
print(" Done ");
}
////////////////////////////////////////////////////
//
// Create a new map!
//
////////////////////////////////////////////////////
void CreateMap(int exitok)
{
unsigned lwidth,lheight,i;
int mapnum;
long size;
char lname[16];
if ((mapnum=SelectMap(exitok,NOTCREATED,"TO CREATE"))==-1)
return;
InputMap(lname,&lwidth,&lheight,exitok);
if (!lname[0])
return;
RemoveUndoBuffers();
SaveCutBuffers();
if (MapBkgnd)
{
MMFreePtr((memptr *)&MapBkgnd);
MMFreePtr((memptr *)&CutBkgnd);
}
if (MapFrgnd)
{
MMFreePtr((memptr *)&MapFrgnd);
MMFreePtr((memptr *)&CutFrgnd);
}
if (MapInfoPl)
{
MMFreePtr((memptr *)&MapInfoPl);
MMFreePtr((memptr *)&CutInfoPl);
}
size=2L*(lwidth*lheight);
if (MapFileHeader->maptype&BPLANE)
{
MMAllocate((memptr *)&MapBkgnd,size);
MMAllocate((memptr *)&CutBkgnd,size);
for(i=0;i<lwidth*lheight;i++)
*(MapBkgnd+i)=*(CutBkgnd+i)=0;
}
if (MapFileHeader->maptype&FPLANE)
{
MMAllocate((memptr *)&MapFrgnd,size);
MMAllocate((memptr *)&CutFrgnd,size);
for(i=0;i<lwidth*lheight;i++)
*(MapFrgnd+i)=*(CutFrgnd+i)=0;
}
if (MapFileHeader->maptype&IPLANE)
{
MMAllocate((memptr *)&MapInfoPl,size);
MMAllocate((memptr *)&CutInfoPl,size);
for(i=0;i<lwidth*lheight;i++)
*(MapInfoPl+i)=*(CutInfoPl+i)=0;
}
whichmap=mapnum;
strcpy(MapHeader.name,lname);
MapHeader.width=mapwidth=lwidth;
MapHeader.height=mapheight=lheight;
strcpy(MapNames[mapnum],MapHeader.name);
AllocateUndoBuffers();
DirtyFlag=1;
SaveMap(0);
DirtyFlag=0;
RestoreCutBuffers();
SelectMode=PasteMode=xbase=ybase=0;
SelX1=SelX2=SelY1=SelY2=-1;
writeH=1;
}
////////////////////////////////////////////////////
//
// Load a map
//
////////////////////////////////////////////////////
void LoadMap(int mapnum)
{
unsigned long csize,size=0;
memptr block;
SaveCutBuffers();
//
// DEALLOCATE ALL CURRENT MAP MEMORY
//
RemoveUndoBuffers();
if (MapBkgnd)
{
MMFreePtr((memptr *)&MapBkgnd);
MMFreePtr((memptr *)&CutBkgnd);
}
if (MapFrgnd)
{
MMFreePtr((memptr *)&MapFrgnd);
MMFreePtr((memptr *)&CutFrgnd);
}
if (MapInfoPl)
{
MMFreePtr((memptr *)&MapInfoPl);
MMFreePtr((memptr *)&CutInfoPl);
}
//
// LOAD MAP HEADER
//
if (XMSmaps)
XMSmove(XMSmaps,MapFileHeader->dataoffsets[mapnum],0,(long)&MapHeader,sizeof(MapHeaderStr));
else
LoadFile(mapname,(char huge *)&MapHeader,MapFileHeader->dataoffsets[mapnum],sizeof(MapHeaderStr));
//
// LOAD & DECOMPRESS MAP PLANES
//
if (MapFileHeader->maptype & BPLANE)
{
if (XMSmaps)
XMSmove(XMSmaps,MapHeader.mapbkgndpl,0,(long)&size,2);
else
LoadFile(mapname,(char huge *)&size,MapHeader.mapbkgndpl,2);
MMAllocate((memptr *)&MapBkgnd,size);
MMAllocate((memptr *)&CutBkgnd,size);
csize=MapHeader.mapbkgndlen-2;
MMAllocate(&block,csize);
if (XMSmaps)
XMSmove(XMSmaps,MapHeader.mapbkgndpl+2,0,(long)MK_FP(block,0),csize);
else
LoadFile(mapname,MK_FP(block,0),MapHeader.mapbkgndpl+2,csize);
RLEWExpand(MK_FP(block,0),MK_FP(MapBkgnd,0),size,MapFileHeader->RLEWtag);
MMFreePtr(&block);
}
if (MapFileHeader->maptype & FPLANE)
{
if (XMSmaps)
XMSmove(XMSmaps,MapHeader.mapfrgndpl,0,(long)&size,2);
else
LoadFile(mapname,(char huge *)&size,MapHeader.mapfrgndpl,2);
MMAllocate((memptr *)&MapFrgnd,size);
MMAllocate((memptr *)&CutFrgnd,size);
csize=MapHeader.mapfrgndlen-2;
MMAllocate(&block,csize);
if (XMSmaps)
XMSmove(XMSmaps,MapHeader.mapfrgndpl+2,0,(long)MK_FP(block,0),csize);
else
LoadFile(mapname,MK_FP(block,0),MapHeader.mapfrgndpl+2,csize);
RLEWExpand(MK_FP(block,0),MK_FP(MapFrgnd,0),size,MapFileHeader->RLEWtag);
MMFreePtr(&block);
}
if (MapFileHeader->maptype & IPLANE)
{
if (XMSmaps)
XMSmove(XMSmaps,MapHeader.mapinfopl,0,(long)&size,2);
else
LoadFile(mapname,(char huge *)&size,MapHeader.mapinfopl,2);
MMAllocate((memptr *)&MapInfoPl,size);
MMAllocate((memptr *)&CutInfoPl,size);
csize=MapHeader.mapinfolen-2;
MMAllocate(&block,csize);
if (XMSmaps)
XMSmove(XMSmaps,MapHeader.mapinfopl+2,0,(long)MK_FP(block,0),csize);
else
LoadFile(mapname,MK_FP(block,0),MapHeader.mapinfopl+2,csize);
RLEWExpand(MK_FP(block,0),MK_FP(MapInfoPl,0),size,MapFileHeader->RLEWtag);
MMFreePtr(&block);
}
mapwidth=MapHeader.width;
mapheight=MapHeader.height;
strcpy(MapNames[mapnum],MapHeader.name);
AllocateUndoBuffers();
UndoRegion.x=-1;
SaveUndo(0,0,mapwidth,mapheight);
RestoreCutBuffers();
SelectMode=PasteMode=xbase=ybase=0;
SelX1=SelX2=SelY1=SelY2=-1;
}
////////////////////////////////////////////////////
//
// Select a new map!
//
////////////////////////////////////////////////////
btype ClvlB[]={{"\xb",28,5,1},
{"\xc",28,14,1},
{" Exit ",12,17,1}};
DialogDef ClvlD={" SELECT MAP",
30,19,2,&ClvlB[0],NULL};
int smbase=0;
int SelectMap(int exitok,int createflg,char *title)
{
MapHeaderStr TempMapHeader;
unsigned ox,oy,i,dx,dy;
int select=-1,redraw;
if (exitok)
{
ClvlD.numbuttons=3;
ClvlD.height=19;
}
else
{
ClvlD.numbuttons=2;
ClvlD.height=16;
}
DrawDialog(&ClvlD,1);
GetDialogXY(&ClvlD,&dx,&dy);
sy=dy+1;
sx=screencenterx-strlen(title)/2;
print(title);
dx+=3;
dy+=5;
MouseHide();
GetButtonXY(&ClvlD,0,&sx,&sy);
sx-=27;
sy-=2;
print("Map Name\n");
ox=sx+1;
oy=sy+1;
DrawBorder(sx,sy,26,11,2);
MouseShow();
do
{
int mx,my;
//
// DRAW MAP NAMES
//
MouseHide();
for (i=0;i<10;i++)
{
sy=oy+i;
sx=ox;
if (i+smbase==whichmap)
print("*");
else
print(" ");
printint(i+smbase);
print(" ");
sx=ox+5;
MNameOff(sx,sy,i);
}
MouseShow();
redraw=0;
do
{
GetButtonXY(&ClvlD,0,&(unsigned)mx,&(unsigned)my);
if (!CheckList(mx,my,1,1,UparOn,UparOff,0) || keydown[0x48])
{
MouseHide();
GetButtonXY(&ClvlD,0,&sx,&sy);
print(ClvlB[0].text);
smbase-=10;
if (smbase<0)
smbase=0;
redraw=1;
MouseShow();
while(keydown[0x48]);
continue;
}
GetButtonXY(&ClvlD,1,&(unsigned)mx,&(unsigned)my);
if (!CheckList(mx,my,1,1,DnarOn,DnarOff,0) || keydown[0x50])
{
MouseHide();
GetButtonXY(&ClvlD,1,&sx,&sy);
print(ClvlB[1].text);
smbase+=10;
if (smbase>90)
smbase=90;
redraw=1;
MouseShow();
while(keydown[0x50]);
continue;
}
if (exitok)
{
GetButtonXY(&ClvlD,2,&(unsigned)mx,&(unsigned)my);
if (!CheckList(mx,my,6,1,ExitOn,ExitOff,0))
{
RestoreBackground();
return -1;
}
}
if (exitok && keydown[1])
{
RestoreBackground();
return -1;
}
select=CheckList(ox+5,oy,20,10,MNameOn,MNameOff,0);
if (select>=0)
{
MouseHide();
sy=select+oy;
sx=ox+5;
MNameOff(sx,sy,select);
MouseShow();
if ((MapFileHeader->dataoffsets[select+smbase]!=-1 && createflg==NOTCREATED)||
(MapFileHeader->dataoffsets[select+smbase]==-1 && createflg==CREATED))
select=-1;
}
} while(!redraw && select<0);
} while(select<0);
RestoreBackground();
return select+smbase;
}
//
// Print arrows
//
void DnarOn(int x,int y)
{
sx=x;
sy=y;
xormask=1;
drawchar(sx,sy,0xc);
xormask=0;
}
void DnarOff(int x,int y)
{
sx=x;
sy=y;
drawchar(sx,sy,0xc);
}
void UparOn(int x,int y)
{
sx=x;
sy=y;
xormask=1;
drawchar(sx,sy,0xb);
xormask=0;
}
void UparOff(int x,int y)
{
sx=x;
sy=y;
drawchar(sx,sy,0xb);
}
void ExitOn(int x,int y)
{
sx=x;
sy=y;
xormask=1;
print(" Exit ");
xormask=0;
}
void ExitOff(int x,int y)
{
sx=x;
sy=y;
print(" Exit ");
}
//
// Highlight Map Name
//
void MNameOn(int x,int y,int i)
{
xormask=1;
MNameOff(x,y,i);
xormask=0;
}
//
// De-Highlight Map Name
//
void MNameOff(int x,int y,int i)
{
MapHeaderStr TempMapHeader;
sx=x;
sy=y;
if (MapFileHeader->dataoffsets[i+smbase]!=-1)
{
print(" ");
sx=x;
print(MapNames[i+smbase]);
}
else
print("--not created yet--");
}
////////////////////////////////////////////////////
//
// Pick more planes for the map set
//
////////////////////////////////////////////////////
btype PickPlaneb[]={{"X",1,3,1},
{"X",1,6,1},
{" Done ",1,9,2}};
DialogDef PickPlaneD={"Which other planes\n"
"to enable?\n\n"
" Foreground\n\n\n"
" Information"
,18,11,3,&PickPlaneb[0],NULL};
int PickMorePlanes(void)
{
int which;
char planes=7; // 1=bkgnd/2=frgnd/4=info
DrawDialog(&PickPlaneD,1);
do
{
which=CheckButtons(&PickPlaneD);
switch(which)
{
case 0:
RestoreBackground();
return 1;
case 1:
GetButtonXY(&PickPlaneD,0,&sx,&sy);
planes^=2;
MouseHide();
if (planes&2)
print("X");
else
print(" ");
MouseShow();
break;
case 2:
GetButtonXY(&PickPlaneD,1,&sx,&sy);
planes^=4;
MouseHide();
if (planes&4)
print("X");
else
print(" ");
MouseShow();
}
} while(which!=3);
RestoreBackground();
MapFileHeader->maptype=planes;
return 0;
}
////////////////////////////////////////////////////
//
// Get map dimensions
//
////////////////////////////////////////////////////
btype LvlSpecb[]={{" ",1,3,1},
{" ",1,7,1},
{" ",1,11,1},
{" Done ",7,14,2}};
DialogDef LvlSpec={" MAP DIMENSIONS\n"
" Map Name:\n\n\n\n"
" Map Width:\n\n\n\n"
" Map Height:\n",
20,16,4,&LvlSpecb[0],NULL};
void InputMap(char *lvlname,unsigned *levelw,unsigned *levelh,int exitok)
{
unsigned butn,ok=0,nameok=0,widok=0,heightok=0,
ox,oy,width=0,height=0,oldwidth=0,oldheight=0;
char oldname[16]="",name[16]="";
MouseHide();
DrawDialog(&LvlSpec,1);
GetButtonXY(&LvlSpec,1,&sx,&sy);
printint(width);
GetButtonXY(&LvlSpec,2,&sx,&sy);
printint(height);
MouseShow();
//
// START INPUT IMMEDIATELY
//
butn=1;
goto firsttime;
#pragma warn -rch
while (!ok)
#pragma warn +rch
{
butn=CheckButtons(&LvlSpec);
if (!butn)
if (exitok)
{
RestoreBackground();
lvlname[0]=0;
return;
}
else
continue;
firsttime:
xormask=0;
GetButtonXY(&LvlSpec,butn-1,&sx,&sy);
MouseHide();
ox=sx;
oy=sy;
print(LvlSpecb[butn-1].text);
sx=ox;
sy=oy;
switch(butn)
{
case 1:
name[0]=0;
if (!input(name,15))
{
strcpy(name,oldname);
sx=ox;
sy=oy;
print(LvlSpecb[butn-1].text);
}
strcpy(oldname,name);
sx=ox;
sy=oy;
if (name[0])
{
print(name);
nameok=1;
}
else
nameok=0;
if (nameok)
{
butn=2;
GetButtonXY(&LvlSpec,butn-1,&sx,&sy);
ox=sx;
oy=sy;
print(LvlSpecb[butn-1].text);
sx=ox;
sy=oy;
}
else
break;
case 2:
width=0;
if ((width=inputint(9))==ESCOUT)
{
widok=0;
width=oldwidth;
}
if (width)
widok=1;
oldwidth=width;
sx=ox;
sy=oy;
print(LvlSpecb[butn-1].text);
sx=ox;
sy=oy;
printint(width);
if (widok)
{
butn=3;
GetButtonXY(&LvlSpec,butn-1,&sx,&sy);
ox=sx;
oy=sy;
print(LvlSpecb[butn-1].text);
sx=ox;
sy=oy;
}
else
break;
case 3:
height=0;
if ((height=inputint(9))==ESCOUT)
{
heightok=0;
height=oldheight;
}
if (height)
heightok=1;
oldheight=height;
sx=ox;
sy=oy;
print(LvlSpecb[butn-1].text);
sx=ox;
sy=oy;
printint(height);
break;
case 4:
if (2L*height*width>0x10000) // TOO BIG! TRIM IT!
{
errsound();
errsound();
widok=heightok=0;
break;
}
if (nameok && widok && heightok)
ok=1;
}
MouseShow();
}
RestoreBackground();
*levelw=width;
*levelh=height;
strcpy(lvlname,name);
}
////////////////////////////////////////////////////
//
// Item - Input INFOPLANE value
//
////////////////////////////////////////////////////
btype EnterIVb={" ",1,3,1};
DialogDef EnterIV={"Enter a value for\nthe INFO plane:\n\n\n",18,5,1,&EnterIVb,NULL};
void Item_InputInfoplane(void)
{
unsigned val;
if (TsearchMode || BfillMode || FillMode || PasteMode || SelectMode)
return;
clearkeys();
DrawDialog(&EnterIV,1);
MouseHide();
GetButtonXY(&EnterIV,0,&sx,&sy);
if ((val=inputint(9))!=ESCOUT)
whichi=val+tilenum;
RestoreBackground();
DrawInfoBar();
MouseShow();
}
////////////////////////////////////////////////////
//
// Item - Select Tile
//
////////////////////////////////////////////////////
void Item_SelectTile(void)
{
SelectTiles(0);
}
////////////////////////////////////////////////////
//
// Item - Block Fill
//
////////////////////////////////////////////////////
void Item_BlockFill(void)
{
ZeroModes();
BfillMode=1;
DrawInfoBar();
}
//
// DO THE ACTUAL BLOCK FILL
//
void DoBlockFill(void)
{
unsigned loc,i,j,ctrl=0,newt,newm,newi,tton,tmon,tion,from;
if (keydown[0x1d])
ctrl++;
MouseHide();
CopyUndoRegion();
UndoRegion.x=SelX1;
UndoRegion.y=SelY1;
UndoRegion.w=SelX2-SelX1+1;
UndoRegion.h=SelY2-SelY1+1;
if (ctrl)
{
for (j=SelY1;j<=SelY2;j++)
for (i=SelX1;i<=SelX2;i++)
{
loc=j*mapwidth+i;
from=(TileCopy.y+((j-SelY1)%TileCopy.h))*mapwidth+
TileCopy.x+((i-SelX1)%TileCopy.w);
switch(TileCopy.MapOrTileSelect)
{
case 0: // COPY BUFFER
tton=TileCopy.PlanesCopied&BPLANE;
tmon=TileCopy.PlanesCopied&FPLANE;
tion=TileCopy.PlanesCopied&IPLANE;
newt=CutBkgnd[from];
newm=CutFrgnd[from];
newi=CutInfoPl[from];
break;
case 1: // TILES
tton=1;
tmon=tion=0;
newt=((j%TileCopy.h)+TileCopy.y)*selectcols+
TileCopy.x+(i%TileCopy.w);
if (XMSlookup[newt]<0)
tton=0;
break;
case 2: // MASKED
tton=tion=0;
tmon=1;
newm=((j%TileCopy.h)+TileCopy.y)*selectcols+
TileCopy.x+(i%TileCopy.w)+tilenum+maxiconrows*selectcols;
if (XMSlookup[newm]<0)
tmon=0;
else
newm-=tilenum;
}
if (tton)
*(MapBkgnd+loc)=newt;
if (tmon)
*(MapFrgnd+loc)=newm;
if (tion)
*(MapInfoPl+loc)=newi;
if (j>=ybase && j<ybase+screenh &&
i>=xbase && i<xbase+screenw)
{
int tempt,tempm,tempi;
tempt=*(MapBkgnd+loc);
tempm=*(MapFrgnd+loc)+tilenum;
tempi=*(MapInfoPl+loc)+tilenum;
CombineTiles(viewton?tempt:-BkgndColor,viewmon*tempm,viewion*tempi,tsize);
if (GridMode)
Overlay(tsize);
DrawTile((i-xbase)<<(tsize-1),((j-ybase)<<(tsize+2))+8,tsize);
}
}
}
else
for (j=SelY1;j<=SelY2;j++)
for (i=SelX1;i<=SelX2;i++)
{
loc=j*mapwidth+i;
if (planeton)
*(MapBkgnd+loc)=whicht;
if (planemon)
*(MapFrgnd+loc)=whichtm-tilenum;
if (planeion)
*(MapInfoPl+loc)=whichi-tilenum;
if (j>=ybase && j<ybase+screenh &&
i>=xbase && i<xbase+screenw)
{
int tempt,tempm,tempi;
tempt=*(MapBkgnd+loc);
tempm=*(MapFrgnd+loc)+tilenum;
tempi=*(MapInfoPl+loc)+tilenum;
CombineTiles(viewton?tempt:-BkgndColor,viewmon*tempm,viewion*tempi,tsize);
if (GridMode)
Overlay(tsize);
DrawTile((i-xbase)<<(tsize-1),((j-ybase)<<(tsize+2))+8,tsize);
}
}
DirtyFlag=1;
MouseShow();
}
////////////////////////////////////////////////////
//
// Remove the XMS undo buffers
//
////////////////////////////////////////////////////
void RemoveUndoBuffers(void)
{
if (XMSundoB)
XMSFreeMem(XMSundoB);
if (XMSundoF)
XMSFreeMem(XMSundoF);
if (XMSundoI)
XMSFreeMem(XMSundoI);
XMSundoB=XMSundoF=XMSundoI=0;
}
////////////////////////////////////////////////////
//
// Allocate XMS undo buffers
// NOTE: uses "mapwidth" & "mapheight"
//
////////////////////////////////////////////////////
void AllocateUndoBuffers(void)
{
long size=2L*mapwidth*mapheight;
if (MapFileHeader->maptype&BPLANE)
XMSundoB=XMSAllocate(size);
if (MapFileHeader->maptype&FPLANE)
XMSundoF=XMSAllocate(size);
if (MapFileHeader->maptype&IPLANE)
XMSundoI=XMSAllocate(size);
}
////////////////////////////////////////////////////
//
// Save Undo buffers
//
////////////////////////////////////////////////////
void SaveUndo(int x,int y,int w,int h)
{
unsigned hsize=w*2,j;
for (j=y;j<y+h;j++)
{
unsigned off=2*(j*mapwidth+x);
if (MapFileHeader->maptype&BPLANE)
XMSmove(0,(long)MK_FP(MapBkgnd,off),XMSundoB,off,hsize);
if (MapFileHeader->maptype&FPLANE)
XMSmove(0,(long)MK_FP(MapFrgnd,off),XMSundoF,off,hsize);
if (MapFileHeader->maptype&IPLANE)
XMSmove(0,(long)MK_FP(MapInfoPl,off),XMSundoI,off,hsize);
}
}
////////////////////////////////////////////////////
//
// Restore Undo buffers
//
////////////////////////////////////////////////////
void RestoreUndo(void)
{
long size=2L*UndoRegion.w;
unsigned j;
sound(2000);
for (j=UndoRegion.y;j<UndoRegion.y+UndoRegion.h;j++)
{
unsigned loc=2*(j*mapwidth+UndoRegion.x);
if (MapFileHeader->maptype&BPLANE)
XMSmove(XMSundoB,loc,0,(long)MK_FP(MapBkgnd,loc),size);
if (MapFileHeader->maptype&FPLANE)
XMSmove(XMSundoF,loc,0,(long)MK_FP(MapFrgnd,loc),size);
if (MapFileHeader->maptype&IPLANE)
XMSmove(XMSundoI,loc,0,(long)MK_FP(MapInfoPl,loc),size);
}
nosound();
}
////////////////////////////////////////////////////
//
// Copy the current UNDO region to the undo buffers
//
////////////////////////////////////////////////////
void CopyUndoRegion(void)
{
if (UndoRegion.x==-1)
return;
SaveUndo(UndoRegion.x,UndoRegion.y,UndoRegion.w,UndoRegion.h);
}
////////////////////////////////////////////////////
//
// Item - Undo
//
////////////////////////////////////////////////////
void Item_Undo(void)
{
if (UndoRegion.x==-1)
{
ErrDialog("You don't have anything to UNDO!"," Oh, yeah. ");
return;
}
RestoreUndo();
DrawMap();
}
////////////////////////////////////////////////////
//
// Item - Tile Search!
//
////////////////////////////////////////////////////
void Item_TileSearch(void)
{
int num=planeton+planemon+planeion;
ZeroModes();
if (num>1)
{
ErrDialog("TILE SEARCH will only work\n"
"with ONE active plane! Make\n"
"sure that the tile you're\n"
"searching for is selected!"," OK ");
return;
}
TsearchMode=1;
DrawInfoBar();
DrawMap();
}
////////////////////////////////////////////////////
//
// Item - Launch
//
////////////////////////////////////////////////////
char tempparm[40];
void Item_Launch(void)
{
TempStruct LaunchInfo;
char ename[64],*envstr[15],temp[40],temp1[40],temp2[40],tiname[14]="TEDINFO.TMP",i,j;
long size;
int rottlaunch;
int startp;
unsigned mx,my;
rottlaunch=0;
if (!TEDInfo->launchname[0])
{
ErrDialog("You didn't specify a launching\n"
"name on the command line? What\n"
"do I launch, Einstein? Geez!"," What a goober. ");
return;
}
//
// Save the handles for all XMS memory so we don't
// have to re-install this shit!
//
TEDInfo->OldCgaXMS=CgaXMS;
TEDInfo->OldEgaXMS=EgaXMS;
TEDInfo->OldVgaXMS=VgaXMS;
TEDInfo->OldCgaXMSsize=CgaXMSsize;
TEDInfo->OldEgaXMSsize=EgaXMSsize;
TEDInfo->OldVgaXMSsize=VgaXMSsize;
size=4L*(tilenum+tilemnum);
if (CgaXMS)
{
if (1024L*XMSTotalFree()<size)
{
XMSFreeMem(CgaXMS);
TEDInfo->OldCgaXMS=TEDInfo->OldCgaXMSsize=0;
}
else
{
TEDInfo->CgaXMSlook=XMSAllocate(size);
XMSmove(0,(long)MK_FP(CgaXMSlookup,0),TEDInfo->CgaXMSlook,0,size);
}
}
if (EgaXMS)
{
if (1024L*XMSTotalFree()<size)
{
XMSFreeMem(EgaXMS);
TEDInfo->OldEgaXMS=TEDInfo->OldEgaXMSsize=0;
}
else
{
TEDInfo->EgaXMSlook=XMSAllocate(size);
XMSmove(0,(long)MK_FP(EgaXMSlookup,0),TEDInfo->EgaXMSlook,0,size);
}
}
if (VgaXMS)
{
if (1024L*XMSTotalFree()<size)
{
XMSFreeMem(VgaXMS);
TEDInfo->OldVgaXMS=TEDInfo->OldVgaXMSsize=0;
}
else
{
TEDInfo->VgaXMSlook=XMSAllocate(size);
XMSmove(0,(long)MK_FP(VgaXMSlookup,0),TEDInfo->VgaXMSlook,0,size);
}
}
//
// SAVE CURRENT VIDEOMODE FOR LAUNCH RETURN
//
LaunchInfo.lastmode=videomode;
strcpy(LaunchInfo.ext,ext);
SaveFile(tiname,(char huge *)&LaunchInfo,0,sizeof(TempStruct));
//
// ICON CHANGE ON LAUNCH?
//
if (keydown[0x2A])
{
rottlaunch=1;
startp=5;
mx=xbase+(pixelx>>(tsize+2));
my=ybase+((pixely-8)>>(tsize+2));
}
else
startp=3;
if (pixely>=8 && pixely<infoy*8 && TEDInfo->permicon
&& MapFileHeader->maptype&IPLANE && !usingbat && keydown[0x1d])
{
unsigned i,j;
mx=xbase+(pixelx>>(tsize+2));
my=ybase+((pixely-8)>>(tsize+2));
for (j=0;j<mapheight;j++)
for (i=0;i<mapwidth;i++)
if (MapInfoPl[j*mapwidth+i]==TEDInfo->permicon)
{
MapInfoPl[j*mapwidth+i]=0;
TEDInfo->lastx=i;
TEDInfo->lasty=j;
break;
}
MapInfoPl[my*mapwidth+mx]=TEDInfo->permicon;
DrawMap();
DirtyFlag=1;
}
TEDInfo->oscrx=xbase;
TEDInfo->oscry=ybase;
TEDInfo->pflags=((planeton&1)<<6)|
((planemon&1)<<5)|
((planeion&1)<<4)|
((viewton&1)<<2)|
((viewmon&1)<<1)|
(viewion&1);
_fmemcpy((void far *)TEDInfo->parmstring,(void far *)parmstring,64);
Item_SaveMap();
SaveTEDInfo();
SaveOutputHeader();
if (XMSmaps)
XMSFreeMem(XMSmaps);
strcpy(temp,"Launching ");
_fstrcat((char far *)temp,(char far *)TEDInfo->launchname);
strcat(temp,"...");
ErrDialog(temp,"");
clearkeys();
nosound();
MouseHide();
_fmemcpy((char far *)ename,(char far *)TEDInfo->launchname,14);
envstr[0] = ename;
envstr[1] = "/TEDLEVEL";
itoa(whichmap,temp,10);
envstr[2] = temp;
if (rottlaunch)
{
itoa(mx,temp1,10);
envstr[3] = temp1;
itoa(my,temp2,10);
envstr[4] = temp2;
}
//
// CHOP UP THE PARMSTRING FOR 'EXECV'
//
strcpy(tempparm,parmstring);
envstr[startp]=&tempparm[0];
for(j=startp+1,i=0;i<strlen(tempparm);i++)
if (tempparm[i]==' ')
{
envstr[j]=&tempparm[i+1];
tempparm[i]=0;
j++;
}
envstr[j]=0;
RemoveUndoBuffers();
ShutdownKBD();
//
// ARE WE EXITING WITH A BATCH FILE?
//
if (usingbat)
{
setvideo(TEXT);
exit(whichmap+2);
}
fcloseall();
MMShutdown();
execv(ename,envstr);
SetupKBD();
RestoreBackground();
MouseShow();
ErrDialog("LAUNCHing failed. TED5 will\n"
"now restart."," I have gubs ");
ShutdownKBD();
execlp("TED5.EXE","TED5.EXE","/LAUNCH",NULL);
printf("Couldn't find TED5 for some reason!");
exit(1);
}
////////////////////////////////////////////////////
//
// Item - TILEINFO Copy
//
////////////////////////////////////////////////////
DialogDef TICd=
{"TILEINFOM Copy Kludge\n\n"
"From:\n"
" To:\n"
"Rows:",22,6};
void Item_TINFOCopy(void)
{
unsigned dx,dy,i,from,to,amt;
memptr block;
MouseHide();
DrawDialog(&TICd,1);
GetDialogXY(&TICd,&dx,&dy);
sx=dx+5;
sy=dy+2;
from=inputint(9);
if (from==ESCOUT)
{
RestoreBackground();
MouseShow();
return;
}
sx=dx+5;
sy=dy+3;
to=inputint(9);
if (to==ESCOUT)
{
RestoreBackground();
MouseShow();
return;
}
sx=dx+5;
sy=dy+4;
amt=inputint(9);
if (amt==ESCOUT)
{
RestoreBackground();
MouseShow();
return;
}
amt*=18;
MMAllocate(&block,amt);
for (i=0;i<numtmplanes;i++)
{
movedata((unsigned)TMinfo[i],from,(unsigned)block,0,amt);
movedata((unsigned)block,0,(unsigned)TMinfo[i],to,amt);
}
MMFreePtr(&block);
RestoreBackground();
DirtyFlag=writeH=1;
MouseShow();
}